#include <iostream>

/*饿汉模式*/
class Singleton{
    private:
        static Singleton _eton;  // 声明
        Singleton():_data(99){
            std::cout << "单例对象构造" << std::endl;
        }
        ~Singleton(){}
        Singleton(const Singleton&) = delete; // 禁止拷贝构造
        
    private:
        int _data;
    public:
        static Singleton& getInstance(){
            return _eton;
        }
        int getData(){
            return _data;
        }
};
// Singleton Singleton::_eton; // 定义


// int main()
// {
//     // std::cout << Singleton::getInstance().getData() << std::endl;
//     return 0;
// }

/*懒汉模式*/
// 使用静态局部变量（C++11及以上标准保证线程安全）
// C++11 static local variables特性以确保静态变量将能够在满足线程安全的前提下，被唯一的构造和析构
class LazySingleton{
    private:
        LazySingleton():_data(99){
            std::cout << "单例对象构造" << std::endl;
        }
        ~LazySingleton(){}
        LazySingleton(const LazySingleton&) = delete; // 禁止拷贝构造
        
    private:
        int _data;
    public:
        static LazySingleton& getInstance(){
            static LazySingleton _eton;
            return _eton;
        }
        int getData(){
            return _data;
        }
};

int main()
{
    std::cout << LazySingleton::getInstance().getData() << std::endl;
    return 0;
}